#include "fs/file.h"
#include "tools/klib.h"
#include "ipc/mutex.h"

static file_t file_table[FILE_TABLE_SIZE];      // 系统中可打开的文件表
static mutex_t file_alloc_mutex;                // 访问file_table互斥信号量


//分配文件描述符
file_t * file_alloc (void)
{
    file_t * file = (file_t *)0;
    mutex_lock(&file_alloc_mutex);
    for (int i = 0; i < FILE_TABLE_SIZE; i++) 
    {
        file_t * p_file = file_table + i;
        if (p_file->ref == 0) 
        {
			kernel_memset(p_file, 0, sizeof(file_t));
            p_file->ref = 1;
			file = p_file;
            break;
        }
    }
    mutex_unlock(&file_alloc_mutex);
    return file;
}

//释放文件描述符
void file_free (file_t * file)
{
    mutex_lock(&file_alloc_mutex);
    if (file->ref) 
    {
        file->ref--;
    }
    mutex_unlock(&file_alloc_mutex);
}

//增加file的引用计数
void file_inc_ref (file_t * file) 
{
    mutex_lock(&file_alloc_mutex);
	file->ref++;
    mutex_unlock(&file_alloc_mutex);
}



//文件表初始化
void file_table_init (void)
{
    mutex_init(&file_alloc_mutex);
}